import axios, { AxiosError, type AxiosInstance, type AxiosRequestConfig } from 'axios'

//配置默认请求配置
const defaultConfig: AxiosRequestConfig = {
  //基准地址
  baseURL: 'https://mock.presstime.cn/mock/65dea4e3709c8f8aca7cf584/first-project',
  //超时时间
  timeout: 1000 * 10
}

class HttpRequest {
  server: AxiosInstance
  constructor(config: AxiosRequestConfig) {
    //创建axios的实例
    this.server = axios.create(config)

    /**
     * 请求拦截器
     * 客户端发送请求 -> [请求拦截器] -> 服务器
     * token校验(JWT) : 接受服务器返回的 token,存储到 vuex/pinia/本地储存当中
     */

    this.server.interceptors.request.use(
      //请求成功
      (config) => {
        return config
      },

      //请求失败
      (error) => {
        return Promise.reject(error)
      }
    )

    /**
     *  响应拦截器
     *    服务器换返回信息 -> [拦截统一处理] -> 客户端JS获取到信息
     */

    //方法
    this.server.interceptors.response.use(
      //响应成功
      (response) => {
        //取出数据
        const result = response.data
        //业务状态码判断

        if (result.cood !== 1) {
          return Promise.reject(new Error(result.msg))
        }

        return result.data
      },

      //响应失败
      (error) => {
        //基于不同http状态码响应不同的逻辑处理
        return Promise.reject(error)
      }
    )
  }

  get<T>(code: string, params: object = {}): Promise<T> {
    return this.server.get(`/${code}`, { params })
  }


  post<T>(code: string, params: object = {}): Promise<T> {
    return this.server.post(`/${code}`, params)
  }
}

//导出
export default new HttpRequest(defaultConfig)
